import java.io.IOException;
import java.net.*;

public class P2PThread extends Thread {
	private Socket socket = null;
	private Mensagem msg = null;
	
	public P2PThread(Socket cliente) throws IOException
	{
		this.socket = cliente;
		msg = new Mensagem(cliente);
	}
	
	public void run()
	{
		String str = "";
		while (str != null && !str.contentEquals("sai flango")) {
			try {
				P2P.controle.salvarTabelas();
				if ((str = msg.recebe()) == null)
					continue;
				
				String[] noia = str.split("/");
				String host = null;
				
				switch (noia[0]) {
					case "preadd":
						while (!P2P.controle.bloqueiaArquivo(noia[1]));
						P2P.controle.addHost(noia[1], noia[2]);
						P2P.controle.desbloqueiaArquivo(noia[1]);
						msg.envia("ok");
						break;
					case "add":
						while (!P2P.controle.bloqueiaArquivo(noia[1]));
						host = P2P.controle.achaMelhorHost();
						if (P2P.controle.addArquivo(noia[1], host))
							msg.envia(host);
						else
							msg.envia("ja existe");
						
						if (!msg.recebe().contentEquals("cabei"))
							P2P.controle.apagaHost(noia[1], host);
						else
							P2P.controle.desbloqueiaArquivo(noia[1]);
						break;
					case "read":
						while ((host = P2P.controle.getHost(noia[1])) != null && host.contentEquals("/bloqueado!\\"));
						if (host != null)
							msg.envia(host);
						
						if (!msg.recebe().contentEquals("cabei"))
							System.out.println("erro ao ler");
						else
							P2P.controle.addHost(noia[1], noia[2]);
						
						P2P.controle.desbloqueiaArquivo(noia[1]);
							
						break;
					case "del":
						while ((host = P2P.controle.getHost(noia[1])) != null && host.contentEquals("/bloqueado!\\"));
						msg.envia(host);
						if (host != null) {
							String s = msg.recebe(); 
							if (!s.contentEquals("cabei"))
								System.out.println("erro ao apagar");
							
							P2P.controle.apagaHost(noia[1], host);
							
							P2P.controle.desbloqueiaArquivo(noia[1]);
						}
						break;
					case "move":
						while (!P2P.controle.bloqueiaArquivo(noia[1]));
						host = P2P.controle.achaMelhorHost();
						msg.envia(host);
						
						if (msg.recebe().contentEquals("cabei")) {
							P2P.controle.addHost(noia[1], host);
							P2P.controle.apagaHost(noia[1], noia[2]);
						}
						
						P2P.controle.desbloqueiaArquivo(noia[1]);
						break;
					case "change":
						P2P.controle.bloqueiaArquivo(noia[1]);
						msg.envia("vai la");
						msg.recebe();
						
						P2P no = null;
						for (String h : P2P.controle.getHosts(noia[1])) {
							if (h.contentEquals(noia[2]))
								continue;
							no = new P2P(P2P.porta);
							no.abreConexao(h);
							no.abreStreams();
							no.envia("update/" + noia[1] + "/" + noia[2]);
							no.fechaConexao();
							no = null;
						}
						
						P2P.controle.desbloqueiaArquivo(noia[1]);
						break;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		try {
			msg.envia("falooous");
			msg.recebe();
			msg.fechaSreams();
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}
